Técnicas No Supervisadas. Analisis Cluster

Necesitamos analizar los datos de tipo mixto, número, órdinal y nominal. Nos vamos a enfocar en clasificación no supervisada usando R CLUSTERING ALGORITHM: PARTITIONING AROUND MEDOIDS (PAM)

setwd("C:/Users/Pablo/Desktop/Machine_Learning_I/Práctica/Cluster")
df_root <- read.csv ("kc_house_data.csv")
set.seeds=737
df_mas  <- sample_n(df_root, size = 1500)

Distancia de Gower

La distancia es una medida numérica de cuán separados están los individuos, es decir una métrica utilizada para medir la proximidad o similitud entre individuos;

La distancia de Gower se calcula como el promedio de las diferencias parciales entre individuos. Para cada tipo de variable, se usa una métrica de distancia particular que funciona bien para ese tipo y se escala para caer entre 0 y 1

Para las variables cuantitativa La Distancia de Manhattan Para las Variables Ordinales la Distancia un ajuste especial de la Manhattan despúes de haber sido ordenadas Para las Nominales primero se convierte en k columnas Binarias ( para cada categoria de cada variable norminal) y posteriormente se usa el coeficiente de Dice

El coeficiente de Dice [0,1] para medir la similitud entre 2 muestras

Se escala de la siguiente Manera Se define la distancia de Gower como d2ij = 1 − sij , donde sij = p1h=1 (1 − |xih − xjh|/Gh) + a + α p1 + (p2 − d) + p3 es el coeficiente de similaridad de Gower,

p1 es el numero de variables cuantitativas continuas, p2 es el numero de variables binarias, p3 es el numero de variables cualitativas(no binarias), a es el numero de coincidencias (1, 1) en las variables binarias, d es el numero de coincidencias (0, 0) en las variables binarias, α es el numero de coincidencias en las variables cualitativas (no binarias) y Gh es el rango (o recorrido) de la h-esima variable cuantitativa.

gower_dist <- daisy(df_mas, metric = "gower")
## Warning in daisy(df_mas, metric = "gower"): binary variable(s) 9 treated as
## interval scaled
gower_mat  <- as.matrix(gower_dist)

Ejemplo de Casas Más similares, basado en la distancia de Gower

df_mas[which(gower_mat == min(gower_mat[gower_mat != min(gower_mat)]), 
              arr.ind = TRUE)[1, ], ]
##              id      date  price bedrooms bathrooms sqft_living sqft_lot
## 1394 3630080070 7/10/2014 348000        3       2.5        1500     2255
## 1134 3630070280 7/10/2014 418000        2       2.5        1500     3608
##      floors waterfront view condition grade sqft_above sqft_basement
## 1394      2          0    0         3     7       1500             0
## 1134      2          0    0         3     8       1500             0
##      yr_built yr_renovated zipcode     lat     long sqft_living15
## 1394     2005            0   98029 47.5538 -121.997          1440
## 1134     2005            0   98029 47.5472 -121.994          2080
##      sqft_lot15
## 1394       2040
## 1134       2686

Ejemplo de Casas Más Disimilares, basado en la distancia de Gower

df_mas[which(gower_mat == max(gower_mat[gower_mat != max(gower_mat)]), 
              arr.ind = TRUE)[1, ], ]
##             id      date   price bedrooms bathrooms sqft_living sqft_lot
## 847 2420069042 4/24/2015  240000        3       2.0        1553     6550
## 552 7738500731 8/15/2014 4500000        5       5.5        6640    40014
##     floors waterfront view condition grade sqft_above sqft_basement
## 847      1          0    0         3     7       1553             0
## 552      2          1    4         3    12       6350           290
##     yr_built yr_renovated zipcode     lat     long sqft_living15
## 847     1900         2001   98022 47.2056 -121.994          1010
## 552     2004            0   98155 47.7493 -122.280          3030
##     sqft_lot15
## 847      10546
## 552      23408

Selección del algoritmo PAM

Una vez calculada la matriz de distancia emplearemos el algoritmo PAM, basado en una partición de medoids (El término medoids se refiere a un objeto dentro de un grupo para el cual la diferencia promedio entre este y todos los demás miembros del grupo es mínima, es decir el punto más centralmente ubicado del conjunto de datos), en cambio en el método K-means cada Cluster está representado por su centroide. Es un método muy similar a k-means, pero es mucho más robusto a la presencia de Outliers como es en nuestro caso. Es un procedimiento de agrupación iterativa que implica los siguientes pasos:

Step 1

Elejir k entidades aleatorias para convertirse en los Medoids ## Step 2 Asignamos a cada entidad, en nuestro caso a cada “casa” el medoide más cercano basado en la distancia de Gower anteriormente calculada. ## Step 3 Para cada Cluster identificar la observación que produciría la distancia promedio más baja si fuera reasiganada como el Medoid, si fuera así hay que hacer de esta observación el nuevo Medoid. Si al menos un Medoid ha cambiado volvemos Step2, en caso contrario Step4 ## Step 4 FIN

K Means intenta mininizar el ECM total K Medoids minimiza la suma de las diferencias entre los puntos etiquetados para estar en un grupo y un punto designado como el centro de ese grupo Mediod.

Selección del Número óptimo de Clústers

Silhouette, Validación y consistencia dentro de los datos.

Es una medida de cuan similar es objeto dentro del grupo de pertenencia y cuan disimilar con los otros grupos.

Varía entre -1 y 1. Un valor alto indica que un objeto está bien emparejado dentro de su grupo y mal con el resto. Un valor muy bajo o negativo implica una revisión del número de cluster al alza o a la baja

sil_width <- c(NA)
for(i in 2:10){  
  pam_fit <- pam(gower_dist, diss = TRUE, k = i)  
  sil_width[i] <- pam_fit$silinfo$avg.width  
}
plot(1:10, sil_width,
     xlab = "Numero de clusters",
     ylab = "Silhouette")
lines(1:10, sil_width)

Después de calcular el Silhouette para el algoritmo PAM vemos que 2 grupos producen el valor más alto. Aún asi nosotros seleccionamos 3 Cluster para dividir la dispersión del Trabajo y facilitar el entendimiento de los siguientes análisis.

Seleccionamos 3 Clusters

set.seed=737
k <- 3
pam_fit <- pam(gower_dist, diss = TRUE, k)
pam_results <- df_mas %>%
  mutate(cluster = pam_fit$clustering) %>%
  group_by(cluster) %>%
  do(the_summary = summary(.))



#frecuencia del número de casas en cada Clúster
ftable(pam_fit$clustering)
##    1   2   3
##             
##  337 589 574
#descriptivo en cada Clúster
pam_results$the_summary
## [[1]]
##        id                    date         price            bedrooms    
##  Min.   :2.800e+06   3/18/2015 :  7   Min.   :  95000   Min.   :1.000  
##  1st Qu.:1.864e+09   8/19/2014 :  5   1st Qu.: 242000   1st Qu.:3.000  
##  Median :3.751e+09   10/10/2014:  4   Median : 289000   Median :3.000  
##  Mean   :4.345e+09   10/28/2014:  4   Mean   : 353942   Mean   :3.196  
##  3rd Qu.:7.230e+09   12/16/2014:  4   3rd Qu.: 427500   3rd Qu.:4.000  
##  Max.   :9.836e+09   12/22/2014:  4   Max.   :1550000   Max.   :5.000  
##                      (Other)   :309                                    
##    bathrooms      sqft_living      sqft_lot          floors     
##  Min.   :0.750   Min.   : 720   Min.   :  1968   Min.   :1.000  
##  1st Qu.:1.500   1st Qu.:1280   1st Qu.:  7599   1st Qu.:1.000  
##  Median :1.750   Median :1550   Median :  9135   Median :1.000  
##  Mean   :1.759   Mean   :1644   Mean   : 17704   Mean   :1.102  
##  3rd Qu.:2.000   3rd Qu.:1930   3rd Qu.: 12252   3rd Qu.:1.000  
##  Max.   :3.000   Max.   :3230   Max.   :257875   Max.   :2.500  
##                                                                 
##    waterfront            view          condition         grade       
##  Min.   :0.000000   Min.   :0.0000   Min.   :1.000   Min.   : 4.000  
##  1st Qu.:0.000000   1st Qu.:0.0000   1st Qu.:3.000   1st Qu.: 7.000  
##  Median :0.000000   Median :0.0000   Median :4.000   Median : 7.000  
##  Mean   :0.002967   Mean   :0.1365   Mean   :3.864   Mean   : 6.997  
##  3rd Qu.:0.000000   3rd Qu.:0.0000   3rd Qu.:4.000   3rd Qu.: 7.000  
##  Max.   :1.000000   Max.   :3.0000   Max.   :5.000   Max.   :10.000  
##                                                                      
##    sqft_above   sqft_basement       yr_built     yr_renovated    
##  Min.   : 680   Min.   :   0.0   Min.   :1900   Min.   :   0.00  
##  1st Qu.:1170   1st Qu.:   0.0   1st Qu.:1958   1st Qu.:   0.00  
##  Median :1340   Median :   0.0   Median :1967   Median :   0.00  
##  Mean   :1383   Mean   : 260.6   Mean   :1965   Mean   :  82.88  
##  3rd Qu.:1570   3rd Qu.: 530.0   3rd Qu.:1978   3rd Qu.:   0.00  
##  Max.   :2460   Max.   :1750.0   Max.   :2013   Max.   :2015.00  
##                                                                  
##     zipcode           lat             long        sqft_living15 
##  Min.   :98001   Min.   :47.19   Min.   :-122.5   Min.   : 840  
##  1st Qu.:98022   1st Qu.:47.34   1st Qu.:-122.2   1st Qu.:1420  
##  Median :98032   Median :47.42   Median :-122.2   Median :1640  
##  Mean   :98041   Mean   :47.44   Mean   :-122.2   Mean   :1719  
##  3rd Qu.:98055   3rd Qu.:47.53   3rd Qu.:-122.1   3rd Qu.:2000  
##  Max.   :98198   Max.   :47.78   Max.   :-121.7   Max.   :3010  
##                                                                 
##    sqft_lot15        cluster 
##  Min.   :  1848   Min.   :1  
##  1st Qu.:  7590   1st Qu.:1  
##  Median :  8886   Median :1  
##  Mean   : 17544   Mean   :1  
##  3rd Qu.: 10807   3rd Qu.:1  
##  Max.   :297514   Max.   :1  
##                              
## 
## [[2]]
##        id                   date         price            bedrooms    
##  Min.   :7.600e+06   4/22/2015:  9   Min.   :  82500   Min.   :1.000  
##  1st Qu.:2.114e+09   6/24/2014:  9   1st Qu.: 335000   1st Qu.:2.000  
##  Median :3.996e+09   7/22/2014:  7   Median : 440000   Median :3.000  
##  Mean   :4.590e+09   2/25/2015:  6   Mean   : 475007   Mean   :3.002  
##  3rd Qu.:7.229e+09   4/6/2015 :  6   3rd Qu.: 565000   3rd Qu.:3.000  
##  Max.   :9.834e+09   6/16/2014:  6   Max.   :1370000   Max.   :8.000  
##                      (Other)  :546                                    
##    bathrooms      sqft_living      sqft_lot          floors     
##  Min.   :0.500   Min.   : 520   Min.   :   649   Min.   :1.000  
##  1st Qu.:1.000   1st Qu.:1200   1st Qu.:  4057   1st Qu.:1.000  
##  Median :1.750   Median :1560   Median :  6000   Median :1.000  
##  Mean   :1.761   Mean   :1623   Mean   :  7755   Mean   :1.308  
##  3rd Qu.:2.250   3rd Qu.:1990   3rd Qu.:  8100   3rd Qu.:1.500  
##  Max.   :3.750   Max.   :3690   Max.   :159865   Max.   :3.000  
##                                                                 
##    waterfront            view          condition         grade       
##  Min.   :0.000000   Min.   :0.0000   Min.   :1.000   Min.   : 5.000  
##  1st Qu.:0.000000   1st Qu.:0.0000   1st Qu.:3.000   1st Qu.: 7.000  
##  Median :0.000000   Median :0.0000   Median :3.000   Median : 7.000  
##  Mean   :0.001698   Mean   :0.2207   Mean   :3.418   Mean   : 7.126  
##  3rd Qu.:0.000000   3rd Qu.:0.0000   3rd Qu.:4.000   3rd Qu.: 8.000  
##  Max.   :1.000000   Max.   :4.0000   Max.   :5.000   Max.   :10.000  
##                                                                      
##    sqft_above   sqft_basement       yr_built     yr_renovated    
##  Min.   : 490   Min.   :   0.0   Min.   :1900   Min.   :   0.00  
##  1st Qu.:1010   1st Qu.:   0.0   1st Qu.:1926   1st Qu.:   0.00  
##  Median :1250   Median : 140.0   Median :1950   Median :   0.00  
##  Mean   :1281   Mean   : 342.1   Mean   :1951   Mean   :  91.58  
##  3rd Qu.:1480   3rd Qu.: 680.0   3rd Qu.:1968   3rd Qu.:   0.00  
##  Max.   :2740   Max.   :1500.0   Max.   :2015   Max.   :2014.00  
##                                                                  
##     zipcode           lat             long        sqft_living15 
##  Min.   :98004   Min.   :47.36   Min.   :-122.4   Min.   : 700  
##  1st Qu.:98107   1st Qu.:47.55   1st Qu.:-122.4   1st Qu.:1320  
##  Median :98118   Median :47.65   Median :-122.3   Median :1570  
##  Mean   :98121   Mean   :47.63   Mean   :-122.3   Mean   :1633  
##  3rd Qu.:98146   3rd Qu.:47.70   3rd Qu.:-122.3   3rd Qu.:1870  
##  Max.   :98199   Max.   :47.78   Max.   :-121.3   Max.   :3720  
##                                                                 
##    sqft_lot15        cluster 
##  Min.   :   915   Min.   :2  
##  1st Qu.:  4080   1st Qu.:2  
##  Median :  6000   Median :2  
##  Mean   :  7668   Mean   :2  
##  3rd Qu.:  8103   3rd Qu.:2  
##  Max.   :215622   Max.   :2  
##                              
## 
## [[3]]
##        id                   date         price            bedrooms    
##  Min.   :1.130e+07   6/20/2014:  9   Min.   : 199950   Min.   :2.000  
##  1st Qu.:2.108e+09   7/31/2014:  8   1st Qu.: 469912   1st Qu.:3.000  
##  Median :3.892e+09   10/9/2014:  7   Median : 672250   Median :4.000  
##  Mean   :4.556e+09   3/25/2015:  7   Mean   : 774354   Mean   :3.862  
##  3rd Qu.:7.214e+09   5/21/2014:  7   3rd Qu.: 899750   3rd Qu.:4.000  
##  Max.   :9.561e+09   5/28/2014:  7   Max.   :4500000   Max.   :8.000  
##                      (Other)  :529                                    
##    bathrooms      sqft_living      sqft_lot          floors     
##  Min.   :1.000   Min.   :1240   Min.   :   704   Min.   :1.000  
##  1st Qu.:2.500   1st Qu.:2229   1st Qu.:  5498   1st Qu.:2.000  
##  Median :2.500   Median :2730   Median :  8322   Median :2.000  
##  Mean   :2.787   Mean   :2870   Mean   : 20278   Mean   :1.936  
##  3rd Qu.:3.000   3rd Qu.:3320   3rd Qu.: 13665   3rd Qu.:2.000  
##  Max.   :5.500   Max.   :7100   Max.   :422967   Max.   :3.000  
##                                                                 
##    waterfront          view          condition         grade       
##  Min.   :0.0000   Min.   :0.0000   Min.   :2.000   Min.   : 7.000  
##  1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:3.000   1st Qu.: 8.000  
##  Median :0.0000   Median :0.0000   Median :3.000   Median : 9.000  
##  Mean   :0.0122   Mean   :0.3467   Mean   :3.209   Mean   : 8.688  
##  3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.:3.000   3rd Qu.: 9.000  
##  Max.   :1.0000   Max.   :4.0000   Max.   :5.000   Max.   :13.000  
##                                                                    
##    sqft_above   sqft_basement       yr_built     yr_renovated    
##  Min.   :1150   Min.   :   0.0   Min.   :1900   Min.   :   0.00  
##  1st Qu.:2022   1st Qu.:   0.0   1st Qu.:1984   1st Qu.:   0.00  
##  Median :2476   Median :   0.0   Median :1997   Median :   0.00  
##  Mean   :2587   Mean   : 282.8   Mean   :1991   Mean   :  79.96  
##  3rd Qu.:3038   3rd Qu.: 497.5   3rd Qu.:2006   3rd Qu.:   0.00  
##  Max.   :6640   Max.   :2720.0   Max.   :2015   Max.   :2010.00  
##                                                                  
##     zipcode           lat             long        sqft_living15 
##  Min.   :98001   Min.   :47.19   Min.   :-122.5   Min.   : 700  
##  1st Qu.:98027   1st Qu.:47.49   1st Qu.:-122.3   1st Qu.:2040  
##  Median :98052   Median :47.59   Median :-122.2   Median :2470  
##  Mean   :98058   Mean   :47.57   Mean   :-122.2   Mean   :2535  
##  3rd Qu.:98075   3rd Qu.:47.67   3rd Qu.:-122.0   3rd Qu.:2960  
##  Max.   :98199   Max.   :47.78   Max.   :-121.7   Max.   :4900  
##                                                                 
##    sqft_lot15        cluster 
##  Min.   :   750   Min.   :3  
##  1st Qu.:  5424   1st Qu.:3  
##  Median :  8194   Median :3  
##  Mean   : 17249   Mean   :3  
##  3rd Qu.: 12561   3rd Qu.:3  
##  Max.   :422967   Max.   :3  
## 

Pequeña Interpretación de los 3 Clusters

Cluster 1. Valores en Media

Nº de Observaciones 7.255 Precio medio 498.294
Nº de habitaciones 3.111
Nº de Banyos 1.663 Nº de Plantas 1.22 Metros cuadrado 1.679 Vistas al mar 0.00634
Visitas 0.2571 Condicion Media 3.47 Grado Medio 7.065 Anyo Contruccion 1944

Cluster 2. Valores en Media

Nº de Observaciones 5.687 Precio medio 412.375
Nº de habitaciones 3.345 Nº de Banyos 1.851 Nº de Plantas 1.068 Metros cuadrado 1.808 Vistas al mar 0.006682 Visitas 0.1721 Condicion Media 3.775 Grado Medio 7.19 Anyo Contruccion 1968

Cluster 3. Valores en Media

Nº de Observaciones 8.655 Precio medio 659.559
Nº de habitaciones 3.611 Nº de Banyos 2.669 Nº de Plantas 2.004 Metros cuadrado 2.014 Vistas al mar 0.00912 Visitas 0.256 Condicion Media 3.119
Grado Medio 8.463 Anyo Contruccion 1996

Reducción de dimensionalidad para visualizar los Clústers.

Visualizacion PCA (linear)

El PCA es un algoritmo lienal, no podrá interpretar relaciones complejas polinómicas entre los items del dataset. Vemos que en los dos primeros componentes recogemos el 50,35% de la variabilidad Seleccionando aquellos componentes con autovalor mayor a 1,los Cuatro Primeros, explican el 71,5% de la variabilidad total.

data<- subset(df_mas, select=c("price", "bedrooms","bathrooms","sqft_living","sqft_lot","floors","waterfront",                                        "view","condition","grade","sqft_above","sqft_basement","sqft_living15","sqft_lot15"))
pca<- prcomp(data, scale=TRUE)

summary (pca)
## Importance of components:
##                           PC1    PC2    PC3     PC4     PC5     PC6
## Standard deviation     2.3256 1.3602 1.2790 1.12476 0.89615 0.83022
## Proportion of Variance 0.3863 0.1321 0.1168 0.09036 0.05736 0.04923
## Cumulative Proportion  0.3863 0.5185 0.6353 0.72568 0.78304 0.83228
##                            PC7     PC8     PC9    PC10    PC11    PC12
## Standard deviation     0.76336 0.74993 0.58364 0.52411 0.46747 0.44626
## Proportion of Variance 0.04162 0.04017 0.02433 0.01962 0.01561 0.01422
## Cumulative Proportion  0.87390 0.91407 0.93840 0.95802 0.97363 0.98786
##                           PC13      PC14
## Standard deviation     0.41233 1.312e-15
## Proportion of Variance 0.01214 0.000e+00
## Cumulative Proportion  1.00000 1.000e+00

ScreePlot refleja el porcentanje de variabilidad explicada por cada Componente Principal

fviz_eig(pca)

Interpretación de cada uno de los componentes Principales

A través de los Scores de cada variable dentro del componente Principal podemos libremente afirmar y con fines explicativos;

PC1

Precio/m2 38% de la variabilidad ## PC2 Espacio Sotano 12% de la variabilidad ## PC3 Espacio Parcela 12% de la varibiliidad ## PC4 Vistas al Mar 9% de la variabilidad

pca
## Standard deviations (1, .., p=14):
##  [1] 2.325609e+00 1.360202e+00 1.278987e+00 1.124760e+00 8.961549e-01
##  [6] 8.302218e-01 7.633611e-01 7.499347e-01 5.836396e-01 5.241091e-01
## [11] 4.674685e-01 4.462595e-01 4.123309e-01 1.312470e-15
## 
## Rotation (n x k) = (14 x 14):
##                       PC1         PC2         PC3          PC4
## price          0.33592998  0.01009483 -0.19828996  0.157970939
## bedrooms       0.26588180 -0.06040847 -0.12282055 -0.334734750
## bathrooms      0.35901450 -0.08948523 -0.01042530 -0.105533325
## sqft_living    0.40824276  0.02707993 -0.04998273 -0.117812244
## sqft_lot       0.09715014  0.60297724  0.32604648 -0.012896489
## floors         0.21833994 -0.30980594  0.32973724  0.136284917
## waterfront     0.07696161  0.08012209 -0.18640320  0.692556325
## view           0.14875818  0.17698171 -0.34088809  0.461241604
## condition     -0.04831934  0.20717225 -0.39887071 -0.242764227
## grade          0.37683756 -0.08221184  0.03967249 -0.006001006
## sqft_above     0.38098320 -0.10429834  0.20936298  0.007662578
## sqft_basement  0.12577199  0.25402312 -0.50082088 -0.259294848
## sqft_living15  0.35337880  0.04002432  0.02222020 -0.024206788
## sqft_lot15     0.07454612  0.60292427  0.34811715  0.003722766
##                        PC5          PC6           PC7         PC8
## price         -0.099597747  0.203760797 -0.2580028726  0.06330785
## bedrooms      -0.018482836 -0.522250809  0.4276419250 -0.43542537
## bathrooms      0.073246598 -0.259518981  0.0000601445  0.24313360
## sqft_living    0.069247830  0.002954439 -0.0891225293 -0.04159066
## sqft_lot       0.009224849 -0.089981270  0.0033784220  0.06229947
## floors        -0.179953501 -0.253077781  0.1843054729  0.61971669
## waterfront    -0.081038655 -0.511047908 -0.3494145794 -0.20572616
## view           0.060126086  0.271223706  0.7169514892  0.10037889
## condition     -0.827147703 -0.013123726 -0.0409678502  0.16434781
## grade          0.004180125  0.253572122 -0.1730557863  0.11143305
## sqft_above    -0.171658863  0.073426868 -0.0028889268 -0.22444444
## sqft_basement  0.469354366 -0.133087985 -0.1796824357  0.33916505
## sqft_living15 -0.035668295  0.346652068 -0.0785180332 -0.31361622
## sqft_lot15    -0.041282780 -0.061293702  0.0493790502  0.04508949
##                        PC9        PC10         PC11        PC12
## price         -0.728147998  0.02761124  0.293598292 -0.26804655
## bedrooms      -0.246174233  0.22365388  0.118339313  0.16109091
## bathrooms      0.265927734 -0.66994686  0.413911123 -0.04664624
## sqft_living    0.052759116 -0.07718104 -0.449240618 -0.21146975
## sqft_lot      -0.126012531 -0.06490556 -0.304756623  0.08890671
## floors         0.031151601  0.43717549 -0.049862529 -0.13387671
## waterfront     0.161349568  0.06744470 -0.038691145  0.09291217
## view           0.045690480 -0.09800650 -0.059686909  0.02833146
## condition      0.135689969 -0.01945925 -0.056404394  0.04118896
## grade         -0.024953567  0.06206308 -0.001847594  0.85405490
## sqft_above     0.003557970 -0.21546174 -0.418209210 -0.19101068
## sqft_basement  0.102865542  0.24819050 -0.140363820 -0.07716868
## sqft_living15  0.510952052  0.40746909  0.294090866 -0.21201482
## sqft_lot15     0.005132805  0.08159547  0.376773997 -0.03931990
##                       PC13          PC14
## price         -0.108411627  4.448931e-16
## bedrooms      -0.048864817 -8.170574e-17
## bathrooms     -0.164259708 -1.063293e-15
## sqft_living    0.249238837  6.959547e-01
## sqft_lot      -0.622543507 -8.499485e-17
## floors        -0.045790253  1.556391e-16
## waterfront     0.020341296  1.340282e-16
## view           0.016403366 -1.568287e-16
## condition      0.003169665 -2.377051e-16
## grade          0.095158502  3.160258e-16
## sqft_above     0.231484861 -6.351649e-01
## sqft_basement  0.078893512 -3.349815e-01
## sqft_living15 -0.296544923  3.250141e-17
## sqft_lot15     0.591273532 -3.030254e-20

Cluster dentro de los PCA’s

Visualizaremos nuestros 3 Clústeres dentro del plano PC1 y PC2, Observamos que tenemos problemas los valores extremos por un lado y por otro la gran partes de los items se nos acumulan muy próximos lo cual no nos facilita la comprensión de los Grupos.

Planteamos nuesvas alternativas al entender que el PCA es insuficiente para interpretar nuestros Clusters

#join pca data y df cluster


pam_fit$clustering <- as.character(pam_fit$clustering)
pca_data <- data.frame(pca$x, cluster=pam_fit$clustering)

ggplot(pca_data, aes(x=PC1, y=PC2, color=cluster)) + geom_point()

Visualizacion t-SNE (non-parametric/ nonlinear)

https://lvdmaaten.github.io/tsne/

https://cran.r-project.org/web/packages/tsne/tsne.pdf

Algoritmo de reducción de dimensionalidad no lineal, encuentra patrones en los datos mediante la identificación de grupos observados basados en la similitud de puntos de datos con múltiples características.

Esta técnica permite utilizar la métrica anteiormente creada, la Distancia de Gower, en nuestro caso se muestran los tres grupos que seleccionamos anteriorenteme con el algortimo PAM.

Asigna los datos multidimensionales creados en la Distancia de Gower anteriormente calculada a un espacio dimensional menor.

Algoritmo t-SNE

Muy útil para el “crowding problem” que implica “la maldición de la dimensión” y básicamente en nuestro caso afecta ya que al aumentar el número de dimensiones la distancia al vecino más próximo aumenta.

Step1

Comienza convirtiendo la distancia, nuestro caso Gower, entre los puntos de datos en medidas de probabilidad condicionales que representan similtud entre los datos. Función Gaussiana, probabilidad alta y probabilidad Baja Hay que prestar atención a las colas que son estrechas y pueden acumular mucha relación de puntos.

Step2

Representando la distribución de Probabilidad. La idea intuitiva es realizar asignaciones de baja dimensión que representen distribuciones de probabilidad similares, aquí nos podemos encontrar con “crowding problem” debido a las “colas cortas” de las distribuciones Gaussianas. Para subsanar este problema y que los puntos tengan una “cola más larga” la t-sne usa uns distribución T-stundent con un grado de libertad. La optimización de esta distribución t-student se realiza mediante una función Gradiente Descendiente que intuitivamenete representa la fuerza y la atracción-repulsión entre dos puntos. Gradiente positivo implica atracción y al contrario. Este “push-and-pull” hace que los puntos se asienten en espacio de baja dimensionalidad.

Step 3

Las t-snes no tienen parámetros y optimizan directamente a través de la función de Coste Gradiente que es No Convexa y puede darnos problemas con los mínimos locales. Existen funciones para corregir este crecimiento de la función Gradiente sobre todo al comienzo del algoritmo. Importante el concepto de vecino estocásticos lo cual implica que no está cerrada la frontera de los puntos que son vecinos contra los puntos que no lo son permitiendo al algotimo tener en cuenta la estructura local como la global.( esto lo realizaremos con el parámetro perplexity)

En la siguiente visualización aparecen los 3 clúster dentro los ejes X e Y El número de dimensiones por defecto es 2

Perplexity es el parámetro que usamos para equilibrar el aspecto local y global de los datos, es en cierta medida determinar de forma supuesta cuanto es el número de vecinos quye tendría cada item ( en nuestro ejemplo casa) por defecto es 20, si lo concentramos mucho o lo dispersamos mucho

perplexity=20

tsne_obj <- Rtsne(gower_dist,perplexity = 20, is_distance = TRUE)
tsne_data <- tsne_obj$Y %>%
  data.frame() %>%
  setNames(c("X", "Y")) %>%
  mutate(cluster = factor(pam_fit$clustering))

ggplot(aes(x = X, y = Y), data = tsne_data) +  geom_point(aes(color = cluster))

#join tsne data y df original

df_join<-cbind(tsne_data,df_mas) 

plot_ly(
  df_join, x = ~X, y = ~Y,
  color = ~floors, size = ~price)
## No trace type specified:
##   Based on info supplied, a 'scatter' trace seems appropriate.
##   Read more about this trace type -> https://plot.ly/r/reference/#scatter
## No scatter mode specifed:
##   Setting the mode to markers
##   Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
## Warning: `line.width` does not currently support multiple values.

perplexity=50

tsne_obj <- Rtsne(gower_dist,perplexity = 50, is_distance = TRUE)
tsne_data <- tsne_obj$Y %>%
  data.frame() %>%
  setNames(c("X", "Y")) %>%
  mutate(cluster = factor(pam_fit$clustering))

ggplot(aes(x = X, y = Y), data = tsne_data) +
  geom_point(aes(color = cluster))

#join tsne data y df original

df_join<-cbind(tsne_data,df_mas) 

plot_ly(
  df_join, x = ~X, y = ~Y,
  color = ~condition, size = ~sqft_living   )
## No trace type specified:
##   Based on info supplied, a 'scatter' trace seems appropriate.
##   Read more about this trace type -> https://plot.ly/r/reference/#scatter
## No scatter mode specifed:
##   Setting the mode to markers
##   Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
## Warning: `line.width` does not currently support multiple values.

perplexity=80

Observamos en esta representación que existen grupos mucho más identificables y detallados que en la representación PCA.

tsne_obj <- Rtsne(gower_dist,perplexity = 80, is_distance = TRUE)
tsne_data <- tsne_obj$Y %>%
  data.frame() %>%
  setNames(c("X", "Y")) %>%
  mutate(cluster = factor(pam_fit$clustering))

ggplot(aes(x = X, y = Y), data = tsne_data) +
  geom_point(aes(color = cluster))

#join tsne data y df original

df_join<-cbind(tsne_data,df_mas) 

plot_ly(
  df_join, x = ~X, y = ~Y,
  color = ~condition, size = ~sqft_living   )
## No trace type specified:
##   Based on info supplied, a 'scatter' trace seems appropriate.
##   Read more about this trace type -> https://plot.ly/r/reference/#scatter
## No scatter mode specifed:
##   Setting the mode to markers
##   Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
## Warning: `line.width` does not currently support multiple values.

Exportamos el fichero con la nueva variable Cluster para continuar con nuestros análisis.

write.csv(df_join,file="cluster.csv")